// 创建一个全新的对象，这个对象的__proto__要指向构造函数的原型对象
// 执行构造函数
// 返回值为object类型则作为new方法的返回值返回，否则返回上述全新对象
function _new () {
    let constructor = Array.prototype.shift.call(arguments)
    let obj = {}
    obj.__proto__ = constructor.prototype
    let res = constructor.apply(obj, arguments)
    return res instanceof Object ? res : obj
}

// Test
// 用法一：
function Animal1 (type) {
    this.type = type
}

Animal1.prototype.say = function () {
    console.log('say')
}

let animal1 = _new(Animal1, '哺乳类')

console.log(animal1.type) // 哺乳类
animal1.say() // say

// 用法二：
function Animal2 (type) {
    this.type = type
    return { name: 'dog' }
}

Animal2.prototype.say = function () {
    console.log('say')
}

let animal2 = _new(Animal2, '哺乳类')

console.log(animal2)  // {name: "dog"}

let animal = new Animal2('哺乳类')
console.log(animal) // {name: "dog"}

